#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) { }
    ListNode(int x) : val(x), next(nullptr) { }
    ListNode(int x, ListNode *next) : val(x), next(next) { }
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode *l1, ListNode *l2)
    {
        ListNode *head = nullptr, *tail = nullptr;
        int carry = 0;  // 进位值
        while (l1 || l2) {  // 遍历两个节点
            int n1 = l1 ? l1->val : 0;  // l1 当前节点的值
            int n2 = l2 ? l2->val : 0;  // l2 当前节点的值
            int sum = n1 + n2 + carry;  // 和链表的节点值
            if (!head) {    // 初始状态,结果链表的头尾都指向同一个节点
                head = tail =  new ListNode(sum % 10);
            } else {    // 更新尾部
                tail->next = new ListNode(sum % 10);
                tail = tail->next;
            }
            carry = sum / 10;   // 每次循环更新进位，用于下一个节点的值计算
            if (l1) {   // 如果 l1 没有遍历完,更新 l1 节点
                l1 = l1->next;
            }
            if (l2) {
                l2 = l2->next;
            }
        }
        if (carry > 0) {    // 遍历完 l1 和 l2 之后,如果有进位,需要再新增一个节点来保存
            tail->next = new ListNode(carry);
        }
        return head;    // 返回头节点
    }
};

int main()
{

    return 0;
}
